home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / EMULATOR / D64IMAGE / AssImage / c / AssImage
Text File  |  1997-08-05  |  4KB  |  170 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #ifdef __riscos__
  4. #include <kernel.h>
  5. #endif
  6.  
  7.  
  8. #define MAX_TRACKS 35
  9. #define IMAGE_SIZE 174848
  10.  
  11. #define OUTSTR     stdout
  12.  
  13.  
  14. char Image[IMAGE_SIZE];
  15.  
  16.  
  17. unsigned int Tracks[41] = {
  18.   0x15000000, 0x15001500, 0x15002A00, 0x15003F00,
  19.   0x15005400, 0x15006900, 0x15007E00, 0x15009300,
  20.   0x1500A800, 0x1500BD00, 0x1500D200, 0x1500E700,
  21.   0x1500FC00, 0x15011100, 0x15012600, 0x15013B00,
  22.   0x15015000, 0x13016500, 0x13017800, 0x13018B00,
  23.   0x13019E00, 0x1301B100, 0x1301C400, 0x1301D700,
  24.   0x1201EA00, 0x1201FC00, 0x12020E00, 0x12022000,
  25.   0x12023200, 0x12024400, 0x11025600, 0x11026700,
  26.   0x11027800, 0x11028900, 0x11029A00, 0x1102AB00,
  27.   0x1102BC00, 0x1102CD00, 0x1102DE00, 0x1102EF00,
  28.   0x00030000
  29. };
  30.  
  31.  
  32. int DiscOffset(int t, int s)
  33. {
  34.   unsigned int h;
  35.  
  36.   if ((t<=0) || (t>MAX_TRACKS)) {return(-1);}
  37.   h = Tracks[t-1];
  38.   if ((s<0) || (s>=(h>>24))) {return(-1);}
  39.   return((h&0xffffff)+(s<<8));
  40. }
  41.  
  42.  
  43. int FullBlock(FILE *fp, unsigned char *b)
  44. {
  45.   fread((void*)b,1,256,fp); return(0);
  46. }
  47.  
  48.  
  49. int EmptyBlock(FILE *fp, unsigned char *b)
  50. {
  51.   memset((void*)b,fgetc(fp),256); return(0);
  52. }
  53.  
  54.  
  55. int PackedBlock(FILE *fp, unsigned char *buff)
  56. {
  57.   register int pack, size, h;
  58.   unsigned char *b = buff, *lim = b+256;
  59.  
  60.   size = fgetc(fp); pack = fgetc(fp);
  61.   while (size-- > 0)
  62.   {
  63.     h = fgetc(fp);
  64.     if (h == pack)
  65.     {
  66.       h = fgetc(fp); memset((void*)b,fgetc(fp),h); b+=h; size-=2;
  67.     }
  68.     else
  69.     {
  70.       *b++ = h;
  71.     }
  72.   }
  73.   if (b > lim) {return(-2);}
  74.   return(0);
  75. }
  76.  
  77.  
  78. /* Assemble C64 disc-images in multipart-format (1!..., 2!...) */
  79. int main(int argc, char *argv[])
  80. {
  81.   int counter=2,h,s,files=0;
  82.   FILE *fp;
  83. #ifdef __riscos__
  84.   _kernel_osfile_block block;
  85. #endif
  86.  
  87.   if (argc<3)
  88.   {
  89.     fprintf(OUTSTR,"Use: %s disc_image source0 [source1 ...]\n",argv[0]); return(0);
  90.   }
  91.   memset((void*)Image,0,IMAGE_SIZE);
  92.   while (counter<argc)
  93.   {
  94.     fprintf(OUTSTR,"%s: ",argv[counter]);
  95.     if ((fp = fopen(argv[counter],"rb")) == NULL)
  96.     {
  97.       fprintf(OUTSTR,"Can't open!\n");
  98.     }
  99.     else
  100.     {
  101.       h=0; files++;
  102.       if (counter==2)
  103.       {
  104.         if (fgetc(fp) != 0xfe) {h++;}
  105.         if (fgetc(fp) != 0x03) {h++;}
  106. #ifdef FullMasterHeader
  107.         if (fgetc(fp) != 0xad) {h++;}
  108.         if (fgetc(fp) != 0xa0) {h++;}
  109. #else
  110.         fgetc(fp); fgetc(fp);
  111. #endif
  112.         if (h!=0)
  113.         {
  114.           fprintf(OUTSTR,"Bad master file!\n");
  115.         }
  116.       }
  117.       else
  118.       {
  119.         if (fgetc(fp) != 0x00) {h++;}
  120.         if (fgetc(fp) != 0x04) {h++;}
  121.         if (h!=0)
  122.         {
  123.           fprintf(OUTSTR,"Bad slave file!\n");
  124.         }
  125.       }
  126.       if (h==0)
  127.       {
  128.         while ((h = fgetc(fp)) != EOF)
  129.         {
  130.           s = fgetc(fp);
  131.           if ((s = DiscOffset(h&0x3f,s)) < 0)
  132.           {
  133.             fprintf(OUTSTR,"Illegal track or sector!\n");
  134.           }
  135.           else
  136.           {
  137.             switch (h&0xc0)
  138.             {
  139.               case 0x00: h = FullBlock(fp,Image+s); break;
  140.               case 0x40: h = EmptyBlock(fp,Image+s); break;
  141.               case 0x80: h = PackedBlock(fp,Image+s); break;
  142.               default: h = -1;
  143.             }
  144.             if (h!=0)
  145.             {
  146.               fprintf(OUTSTR,"Error (%d @ %ld)!\n",h,ftell(fp));
  147.             }
  148.           }
  149.         }
  150.       }
  151.       fprintf(OUTSTR,"\n");
  152.       fclose(fp);
  153.     }
  154.     counter++;
  155.   }
  156.   if (files!=0)
  157.   {
  158.     if ((fp = fopen(argv[1],"wb")) == NULL)
  159.     {
  160.       fprintf(OUTSTR,"Unable to save to file <%s>!\n",argv[1]); exit(0);
  161.     }
  162. #ifdef __riscos__
  163.     block.load = 0x164; _kernel_osfile(18,argv[1],&block);
  164. #endif
  165.     fwrite((void*)Image,1,IMAGE_SIZE,fp);
  166.     fclose(fp);
  167.   }
  168.   return(0);
  169. }
  170.